let fs = require('fs');// 内置模块  读写文件
let fsP = fs.promises;
//凡是带有 Sync的 都是同步的
/* fs.readFile('./data.txt2', { encoding: 'utf-8' }, (err, data) => {
  // fs.readFile 异步操作
  // console.log(err, data)
  // 读取完成之后 会触发这个回调函数
  // 若成功则 err为null  data对应的是读取的数据
  // 若失败 则 err 为 错误信息 data是undefined
  if (!err) {
    console.log("读取成功", data)
  } else {
    console.log("读取失败", err)
  }
})
let res = fs.readFileSync('./data.txt')
console.log(res.toString())
console.log("同步start") */

/* fsP.readFile('./data.txt').then(data => {
  console.log(data.toString())
}).catch(err => {
  console.log(err);
}) */
/*
function myRead(url) {
  return new Promise((res, rej) => {
    fs.readFile(url, (err, data) => {
      if (!err) {
        res(data)
      } else {
        rej(err)
      }
    })
  })
}
myRead('./data22.txt').then(data => {
  console.log(data.toString())
}).catch(err => {
  console.log(err);
}) */

/* // 写入  会把之前的内容覆盖掉
fs.writeFile('./data.txt', Buffer.from('和士大夫十分'), { encoding: 'utf-8' }, (err) => {
  if (!err) {
    console.log("写入成功")
  }
})
// fs.writeFileSync('./data.txt', Buffer.from('和士大夫十分666'), { encoding: 'utf-8' })
// fsP.writeFile().then() */
fs.writeFileSync('./data3.txt', Buffer.from('和士大夫十分666'), { encoding: 'utf-8' })

/* // 追加  appendFile
MyAppend('./data2.txt', Buffer.from('和士大夫十分666'), { encoding: 'utf-8' }, err => {
  if (!err) {
    console.log('OK');
  }
})
// fs.appendFileSync
// fsP.appendFile().then()
function MyAppend(url, data, options, cb) {
  data = '\n' + data
  fs.appendFile(url, data, options, cb)
} */

/* // 使用write和read实现append
function append2(url, data, options, cb) {
  // 先读取老的内容 在拼接 再去 写入
  fs.access(url, (err) => {
    if (err) {
      fs.writeFile(url, data, options, cb)
    } else {
      fs.readFile(url, { encoding: 'utf-8' }, (err, val) => {
        if (!err) {
          let str = val + '\n' + data
          fs.writeFile(url, str, options, cb)
        } else {
          console.log(err)
        }
      })
    }
  })
}
append2('./data2.txt', Buffer.from('和士大夫十分666'), { encoding: 'utf-8' }, err => {
  if (!err) {
    console.log('OK');
  }
}) */

// 以上三类 都有同步 异步 和 promise的写法
//      写入和追加 若以前没有这个文件 会自动新增一个文件


/* // 删除
fs.unlink('./data3.txt', err => {
  console.log(err)
}) */

/* 创建文件夹  创建的时候需要注意的是 不能越级创建 ，若已经存在的文件夹 也不能在创建了*/
// fs.mkdir('./data', err => {
//   console.log(err.code);
// })
/* mymkdir('../data/qq/ww')
function mymkdir(url) {
  let ary = url.split('/')
  let a1 = ary.filter(item => item.includes('.'))
  let s1 = a1.join('/')
  let a2 = ary.filter(item => !item.includes('.'))
  console.log(s1, a2)
  function fn() {
    if (a2.length) {
      s1 = s1 + '/' + a2.shift()
      console.log(s1)
      fs.mkdir(s1, (err) => {
        fn()
      })
    }
  }
  fn()
} */

// fs.mkdir('./data/qq/ww', {
//   recursive: true // 深层创造
// }, err => { })

let path = require('path')
/* 
fs.readdir('../day1', (err, data) => {
  console.log(data)
  data.forEach(item => {
    // console.log(path.resolve(__dirname, '../day1', item))
    fs.stat(path.resolve(__dirname, '../day1', item), (err, stat) => {

      console.log(item, stat.isFile())
    })
  })
}) */


// fs.rmdir('./data/qq/ww', err => {
//   console.log(err)
// })
myRmDir('./data', () => { })
function myRmDir(url, cb) {
  fs.stat(url, (err, stat) => {
    console.log(err)
    if (stat.isFile()) {
      fs.unlink(url, cb)
    } else {
      fs.readdir(url, (err, arr) => {
        arr = arr.map(item => path.join(url, item))
        if (arr.length == 0) {
          fs.rmdir(url, cb) //空文件夹 直接删除
        } else {
          let n = 0; // 记录删除的个数
          function done() {
            // 只要删除成功就执行 done
            n++
            if (n === arr.length) {
              fs.rmdir(url, cb)
            }
          }
          for (let i = 0; i < arr.length; i++) {
            let item = arr[i];
            // 循环删除 删除还是自己封装的这个方法
            // 删除成功 会自动执行 done
            myRmDir(item, done)
          }
        }
      })
    }
  })
}


/*
  readFile
  writeFile
  appenFile
  unlink
  mkdir
  readdir
  rmdir
  stat
  access

*/





























